package com.ruoyi.common.core.domain.heytalk.netty;

import com.ruoyi.common.core.domain.heytalk.vo.LoginImUser;
import io.netty.channel.Channel;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 用户和channel的关系工具类
 * @author zhusy
 * @since 2021/11/29
 */
public class UserChannelUtils {

    private static final Map<String, Channel> userIdChannelMap = new ConcurrentHashMap<>();

    /**
     * 双向绑定
     * @param loginImUser 用户数据
     * @param channel 通道
     */
    public static void bindUser(LoginImUser loginImUser, Channel channel) {
        userIdChannelMap.put(loginImUser.getUserId(), channel);
        channel.attr(Attributes.loginImUser).set(loginImUser);
    }

    /**
     * 双向解绑
     * @param channel 通道
     */
    public static void unBindUser(Channel channel) {
        if (hasLogin(channel)) {
            userIdChannelMap.remove(getLoginImUser(channel).getUserId());
            channel.attr(Attributes.loginImUser).set(null);
        }
    }

    /**
     * 判断当前channel通道是否已绑定用户
     * @param channel 通道
     * @return 布尔结果
     */
    public static boolean hasLogin(Channel channel) {
        return channel.hasAttr(Attributes.loginImUser);
    }

    /**
     * 通过channel通道获取当前通道绑定的用户数据
     * @param channel 通道
     * @return 用户数据
     */
    public static LoginImUser getLoginImUser(Channel channel) {
        return channel.attr(Attributes.loginImUser).get();
    }

    /**
     * 通过用户ID获取用户对应的channel通道
     * @param userId 用户ID
     * @return 通道
     */
    public static Channel getChannel(String userId) {
        return userIdChannelMap.get(userId);
    }

}
